/*
 * Class: SubsidiaryDAO
 * Created by: Mary Joy Pascual
 * Date Created: 06/16/2014
 * Company: Netsuite
*/
package com.netsuite.dao;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.rpc.ServiceException;
import javax.xml.soap.SOAPException;

import com.netsuite.adapter.SubsidiaryAdapter;
import com.netsuite.constants.Constants;
import com.netsuite.helper.ErrorHelper;
import com.netsuite.helper.ErrorSOAPHelper;
import com.netsuite.logger.LoggerImp;
import com.netsuite.pojo.SubsidiaryPOJO;
import com.netsuite.webservices.lists.accounting_2014_1.Subsidiary;
import com.netsuite.webservices.platform.common_2014_1.SubsidiarySearchBasic;
import com.netsuite.webservices.platform.core_2014_1.Record;
import com.netsuite.webservices.platform.core_2014_1.SearchResult;
import com.netsuite.webservices.platform.faults_2014_1.ExceededRecordCountFault;
import com.netsuite.webservices.platform.faults_2014_1.ExceededRequestLimitFault;
import com.netsuite.webservices.platform.faults_2014_1.ExceededRequestSizeFault;
import com.netsuite.webservices.platform.faults_2014_1.ExceededUsageLimitFault;
import com.netsuite.webservices.platform.faults_2014_1.InvalidCredentialsFault;
import com.netsuite.webservices.platform.faults_2014_1.InvalidSessionFault;
import com.netsuite.webservices.platform_2014_1.NetSuitePortType;

public class SubsidiaryDAO {

	private static String CLASS_NAME = SubsidiaryDAO.class.getName();
	
	private NetSuitePortType _service = null;

	public SubsidiaryDAO() {

		try {
			MainDAO mainDAO = new MainDAO();
			_service = mainDAO.get_service();
		} catch (FileNotFoundException e) {
			LoggerImp.errorLog(CLASS_NAME, Constants.ERROR_FNF+ e.getMessage());
			throw new Error(Constants.ERROR_FNF+ e.getMessage());
		} catch (ServiceException e) {
			LoggerImp.errorLog(CLASS_NAME, Constants.ERROR_SE+ e.getMessage());
			throw new Error(Constants.ERROR_SE+ e.getMessage());
		} catch (IOException e) {
			LoggerImp.errorLog(CLASS_NAME,Constants.ERROR_IO+ e.getMessage());
			throw new Error(Constants.ERROR_IO+ e.getMessage());
		} catch (SOAPException e) {
			LoggerImp.errorLog(CLASS_NAME,Constants.ERROR_SOAP+ e.getMessage());
			throw new Error(Constants.ERROR_SOAP+ e.getMessage());
		}

	}

	public List<SubsidiaryPOJO> getSubsidiaryList() throws ErrorHelper {
		
		LoggerImp.startLog(CLASS_NAME, "getSubsidiaryList()");

		SubsidiarySearchBasic subSearchBasic = new SubsidiarySearchBasic();
		List<SubsidiaryPOJO> subList = new ArrayList<SubsidiaryPOJO>();

		try {
			SearchResult searchResult = _service.search(subSearchBasic);
			if(searchResult.getStatus().isIsSuccess()){
				for (Record rec : searchResult.getRecordList().getRecord()) {
					Subsidiary sub = (Subsidiary) rec;
					subList.add(SubsidiaryAdapter.setSubsidiary(sub));
				}
			}else {
				ErrorSOAPHelper.displayError(CLASS_NAME, searchResult.getStatus().getStatusDetail());
			}

		} catch (ExceededRequestSizeFault e) {
			LoggerImp.errorLog(CLASS_NAME, Constants.ERROR_SIZ+ e.getMessage());
			throw new ErrorHelper(CLASS_NAME,Constants.ERROR_SIZ+ e.getMessage());
		} catch (InvalidCredentialsFault e) {
			LoggerImp.errorLog(CLASS_NAME, Constants.ERROR_INV+ e.getMessage());
			throw new ErrorHelper(CLASS_NAME,Constants.ERROR_INV+ e.getMessage());
		} catch (ExceededUsageLimitFault e) {
			LoggerImp.errorLog(CLASS_NAME, Constants.ERROR_USE+ e.getMessage());
			throw new ErrorHelper(CLASS_NAME,Constants.ERROR_USE+ e.getMessage());
		} catch (ExceededRequestLimitFault e) {
			LoggerImp.errorLog(CLASS_NAME, Constants.ERROR_REQ+ e.getMessage());
			throw new ErrorHelper(CLASS_NAME,Constants.ERROR_REQ+ e.getMessage());
		} catch (ExceededRecordCountFault e) {
			LoggerImp.errorLog(CLASS_NAME, Constants.ERROR_MAX+ e.getMessage());
			throw new ErrorHelper(CLASS_NAME,Constants.ERROR_MAX+ e.getMessage());
		} catch (InvalidSessionFault e) {
			LoggerImp.errorLog(CLASS_NAME, Constants.ERROR_SES+ e.getMessage());
			throw new ErrorHelper(CLASS_NAME,Constants.ERROR_SES+ e.getMessage());
		} catch (RemoteException e) {
			LoggerImp.errorLog(CLASS_NAME, Constants.ERROR_REM+ e.getMessage());
			throw new ErrorHelper(CLASS_NAME,Constants.ERROR_SES+ e.getMessage());
		}

		LoggerImp.endLog(CLASS_NAME, "getSubsidiaryList()");
		
		return subList;
	}

}
